【机器学习-4】神经网络算法——NeuralNetwork

一、NeuralNetwork

import numpy as np
def tanh(x):
    return np.tanh(x)

def tanh_deriv(x):
    return 1.0-np.tanh(x)*np.tanh(x)

def logistic(x):
    return 1/(1+np.exp(-x))

def logistic_derivative(x):
    return logistic(x)*(1-logistic(x))

class NeuralNetwork:
    def __init__(self,layers,activation='tanh'):
    #根据类实例化一个函数,_init_代表的是构造函数
    #self相当于java中的this
        """
        :param layers:一个列表,包含了每层神经网络中有几个神经元,至少有两层,输入层不算作
                [, , ,]中每个值代表了每层的神经元个数
        :param activation:激活函数可以使用tanh 和 logistics,不指明的情况下就是tanh函数
        """
        if activation =='logistic':
            self.activation = logistic
            self.activation_deriv = logistic_derivative
        elif activation =='tanh':
            self.activation =tanh
            self.activation_deriv=tanh_deriv
        #初始化weights,    
        self.weights =[]
        #len(layers)layer是一个list[10,10,3],则len(layer)=3
        #除了输出层都要赋予一个随机产生的权重
        for i in range(1,len(layers)-1):
            #np.random.random为nunpy随机产生的数
            #实际是以第二层开始,前后都连线赋予权重,权重位于[-0.25,0.25]之间
            self.weights.append((2*np.random.random((layers[i-1]+1,layers[i]+1))-1)*0.25)
            self.weights.append((2*np.random.random((layers[i]+1,layers[i+1]))-1)*0.25)
    #定义一个方法,训练神经网络
    def fit(self,X,y,learning_rate=0.2,epochs=10000):
        #X:数据集,确认是二维,每行是一个实例,每个实例有一些特征值
        X=np.atleast_2d(X)
        #np.ones初始化一个矩阵,传入两个参数全是1
        #X.shape返回的是一个list[行数,列数]
        #X.shape[0]返回的是行,X.shape[1]+1:比X多1,对bias进行赋值为1
        temp = np.ones([X.shape[0],X.shape[1]+1])
        #“ :”取所有的行
        #“0:-1”从第一列到倒数第二列,-1代表的是最后一列
        temp[:,0:-1]=X
        X=temp
        #y:classlabel,函数的分类标记
        y=np.array(y)
        #K代表的是第几轮循环 
        for k in range(epochs):
            #从0到X.shape[0]随机抽取一行做实例
            i =np.random.randint(X.shape[0])
            a=[X[i]]
            
            #正向更新权重    ,len(self.weights)等于神经网络层数
            for l in range(len(self.weights)):
                #np.dot代表两参数的内积,x.dot(y) 等价于 np.dot(x,y)
                #即a与weights内积,之后放入非线性转化function求下一层
                #a输入层,append不断增长,完成所有正向的更新
                a.append(self.activation(np.dot(a[l],self.weights[l])))
            #计算错误率,y[i]真实标记   ,a[-1]预测的classlable   
            error=y[i]-a[-1]
            #计算输出层的误差,根据最后一层当前神经元的值,反向更新
            deltas =[error*self.activation_deriv(a[-1])]
            
            #反向更新
            #len(a)所有神经元的层数,不能算第一场和最后一层
            #从最后一层到第0层,每次-1
            for l in range(len(a)-2,0,-1):
                #
                deltas.append(deltas[-1].dot(self.weights[l].T)*self.activation_deriv(a[l]))
            #reverse将deltas的层数跌倒过来
            deltas.reverse()
            for i in range(len(self.weights)):
                #
                layer = np.atleast_2d(a[i])
                #delta代表的是权重更新
                delta = np.atleast_2d(deltas[i])
                #layer.T.dot(delta)误差和单元格的内积
                self.weights[i]+=learning_rate*layer.T.dot(delta)
        
    def predict(self,x):
        x=np.array(x)
        temp=np.ones(x.shape[0]+1)
        #从0行到倒数第一行
        temp[0:-1]=x 
        a=temp
        for l in range(0,len(self.weights)):
            a=self.activation(np.dot(a,self.weights[l]))
        return a           
                

 

二、TestOXR(异或)

#从自定义的NeuralNetwork包中导入NeuralNetwork模块
from NeuralNetwork import NeuralNetwork
import numpy as np

nn=NeuralNetwork([2,2,1],'tanh')
X=np.array([[0,0],[1,0],[0,1],[1,1]])
y=np.array([0,1,1,0])
nn.fit(X,y)
for i in [[0,0],[1,0],[0,1],[1,1]]:
    print(i,nn.predict(i))

运行结果:

1.TypeError: object() takes no parameters

 

 

解决办法:
def fit与
原因是:
def __init__(self,layers,activation='tanh'):中的__init__设置成了_init_,,细致看,自己定义的两下划线明显比正确的短
解决办法:将__init__设置正确


是两个平级定义

2. AttributeError: 'NeuralNetwork' object has no attribute 'fit'

 

原因:
def fit(self,X,y,learning_rate=0.2,epochs=10000):
此处定义设置成ldef __init__(self,layers,activation='tanh'):的子定义,因此找不到fit

3.格外注意定义的self.weights =[],极易将weights写错成weight

 

4.ValueError: setting an array element with a sequence.

原因:

X = np.array([[0, 0], [0, 1], [1.0], [1, 1]])中将逗号写成句号

三、手写数字(HandwrittenDigitsRecognition)

运行结果:

【bug-01】

  /home/kongzewuxin/anaconda3/lib/python3.5/site-packages/sklearn/cross_validation.py:41: DeprecationWarning:       This module was deprecated in version 0.18 in favor of the model_selection module into which all the refactored classes and functions are moved. Also note that the interface of the new CV iterators are different from that of this module. This module will be removed in 0.20.

  "This module will be removed in 0.20.", DeprecationWarning)

解决办法:from sklearn.cross_validation import train_test_split改成

from sklearn.model_selection import train_test_split

【bug-02

          UndefinedMetricWarning: Precision  are ill-defined and being set to 0.0 in labels with no predicted samples.

          'precision', 'predicted', average, warn_for[k1] )

原因分析:在下述代码中

for i in range(X_test.shape[0]):

             o = nn.predict(X_test[i])

             #严重失误,错将o写成0

             predictions.append(np.argmax[k2] (o))

其它参考http://www.cnblogs.com/albert-yzp/p/9534891.html

参考:https://blog.csdn.net/akadiao/article/details/78040405

 

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: GA-BP 神经网络算法是一种结合了遗传算法和反向传播算法神经网络算法,常用于解决分类、回归等问题。在 MATLAB 中,可以使用 Neural Network Toolbox 工具箱来实现 GA-BP 神经网络算法。 首先,需要定义神经网络的结构,包括输入层、隐藏层和输出层的节点数、激活函数等。然后,使用 genfis 函数生成模糊推理系统,将其作为神经网络的初始化权重。接着,使用 ga 函数优化神经网络的权重和偏置,同时使用 train 函数对神经网络进行训练。最后,使用 sim 函数对测试数据进行预测。 以下是一个简单的 GA-BP 神经网络算法的 MATLAB 代码示例: ```matlab % 定义神经网络结构 inputNodes = 4; hiddenNodes = 8; outputNodes = 3; activationFcn = 'tansig'; % 生成模糊推理系统并初始化神经网络权重 fis = genfis(data, outputNodes); net = newff(fis.input, fis.output, [hiddenNodes outputNodes], {activationFcn, 'purelin'}); % 定义优化函数和训练函数 fitnessFcn = @(w) ga_fitness(w, net, data, target); trainFcn = @(net, data, target) ga_train(net, data, target); % 优化神经网络权重和偏置 options = gaoptimset('Generations', 100, 'PopulationSize', 50); [x, fval] = ga(fitnessFcn, net.numWeightElements, options); % 训练神经网络 net = trainFcn(net, data, target); % 预测测试数据 output = sim(net, testData); ``` 其中,ga_fitness 和 ga_train 分别是自定义的优化函数和训练函数,可以根据具体问题进行修改。在实际使用中,还需要对数据进行预处理、划分训练集和测试集等操作。 ### 回答2: ga-bp神经网络算法(Genetic Algorithm-Backpropagation Neural Network Algorithm)是一种用于解决复杂问题的神经网络算法,结合了遗传算法和反向传播算法。在Matlab中,可以使用MATLAB自带的神经网络工具箱来实现该算法。 首先,我们需要搭建和训练一个神经网络。通过设置网络的输入、输出层的节点数和隐含层的节点数,确定网络的结构。然后,使用MATLAB提供的神经网络工具箱中的train函数对神经网络进行训练。该函数使用了反向传播算法来优化网络的权值和偏置值,使网络能够适应训练数据。 在进行网络训练之前,我们需要确定网络训练的目标,即选择一个合适的性能函数。常用的性能函数有均方误差函数(mean squared error)和交叉熵函数(cross entropy)。这些函数可以衡量网络的输出与目标值之间的差距,通过最小化性能函数来优化网络的训练效果。 在网络训练过程中,遗传算法也起到了重要的作用。遗传算法通过模拟生物进化的过程,不断地对网络的参数进行优化。它通过产生一组初始解,然后使用选择、交叉和变异等操作来演化出更好的解。在每一代的遗传算法优化过程中,由于遗传算法的全局搜索性能,可以有效地避免陷入局部最优解。 在Matlab中,通过ga(遗传算法优化工具)函数可以实现遗传算法部分。我们可以将遗传算法和反向传播算法结合起来,通过遗传算法找到合适的权值和偏置值,并通过反向传播算法进行优化,从而提高神经网络的学习能力和泛化能力。 总之,ga-bp神经网络算法是一种运用遗传算法和反向传播算法相结合的神经网络算法,在Matlab中可以通过神经网络工具箱和遗传算法优化工具来实现。这种算法能够通过全局搜索和局部优化来提高神经网络的性能,对于解决复杂问题具有很好的效果。 ### 回答3: 《ga-bp神经网络算法matlab》是一种结合了遗传算法(GA)和反向传播(BP)算法神经网络算法。遗传算法是通过模拟生物进化过程来搜索最优解的一种优化算法,而反向传播算法是一种常用于训练神经网络算法。 在这种算法中,利用遗传算法的优势来提高BP算法的训练效果。具体步骤如下: 1. 初始化:对神经网络的权重和偏置进行随机初始化,并设置其他相关参数,如种群大小、迭代次数等。 2. 基于遗传算法进行种群进化:使用遗传算法神经网络的权重和偏置进行编码,并生成初始种群。然后通过选择、交叉和变异等操作,对种群进行优胜劣汰,以逐渐找到更优的解。 3. 使用BP算法进行网络训练:将每个个体(神经网络权重和偏置的编码)解码成具体的权重和偏置,然后使用BP算法神经网络进行训练。BP算法的主要目标是通过输入样本的前向传播和误差反向传播,调整神经网络的权重和偏置,使其输出接近于样本的真实值。 4. 重复步骤2和3,直到达到预设的迭代次数或满足停止准则。 通过以上步骤,ga-bp神经网络算法可以使神经网络在训练过程中跳出局部最优解,并更快地找到全局最优解。同时,由于遗传算法的加入,算法具有较好的全局搜索能力和鲁棒性。 在MATLAB中,可以通过使用神经网络工具箱或自行编写代码来实现ga-bp神经网络算法。通过使用MATLAB的优秀优化、神经网络和遗传算法等工具,可以更加高效地实现和调优该算法

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值